package com.duoduo.common.fliter;

import com.auth0.jwt.interfaces.DecodedJWT;
import com.duoduo.common.util.JWTUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
@Slf4j
public class StatelessRealm {

    public static final String USER_AUTHENTICATION = "User";
    public static final String ADMIN_AUTHENTICATION = "Admin";

    //@Autowired
    //private UUserService uUserService;

    /**
     * 解析并认证Token
     *
     * @param token
     * @return
     */
    public boolean doAuthentication(String token) {
        // 解析Token, 验证令牌, 如果解析异常会直接被全局异常处理
        try {
            DecodedJWT decodedJWT = JWTUtil.verify(token);// 解析Token失败
        }catch (Exception e) {
            log.error(e.getMessage());
            return false;
        }
        //String type = decodedJWT.getClaim("type").asString();// 判断用户的类型
//        Integer id = Integer.parseInt(decodedJWT.getClaim("id").asString());// 获取用户id
//        switch (type) {
//            case ADMIN_AUTHENTICATION:
//                return doAdminAuthentication(decodedJWT);
//            case STUDENT_AUTHENTICATION:
//                return doUserAuthentication(decodedJWT);
//            default:
//                return false;
//        }
        return true;
    }

    private boolean doUserAuthentication(DecodedJWT decodedJWT) {
        String account  = decodedJWT.getClaim("userName").asString();// 获取用户账号
        //Date dbLoginDate = uUserService.getAdminLoginTime(account);// 获取DB中的上次登陆时间
        return isTokenExpired(null, decodedJWT);
    }

    private boolean doAdminAuthentication(DecodedJWT decodedJWT) {
        String userName = decodedJWT.getClaim("userName").asString();// 获取用户id
        //Date dbLoginDate = uUserService.getAdminLoginTime(userName);// 获取DB中的上次登陆时间
        return isTokenExpired(null, decodedJWT);
    }

    /**
     *  现在token是计时状态， 如果做退出功能的话， 可以退出的时候向数据库里插入一次时间，
     *  然后判断token是否小于数据库时间，如果小于则说明退出
     * @param dbLastLoginDate
     * @param decodedJWT
     * @return
     */
    private boolean isTokenExpired(Date dbLastLoginDate, DecodedJWT decodedJWT) {
        Long tokenLastLoginTime = Long.parseLong(decodedJWT.getClaim("loginTime").asString());// 获取Token中携带的上次登陆时间
        //Long l = dbLastLoginDate.getTime();
        long time = new Date().getTime();
        if (time > tokenLastLoginTime) {// 判断Token是否失效
            return false;// Token失效了
        } else {
            return true;
        }
    }

    /**
     * 判断用户是否具有指定的角色
     *
     * @param role
     * @return
     */
    public boolean hasRole(String token, String role) {
        DecodedJWT decodedJWT = null;// 解析Token
        try {
            decodedJWT = JWTUtil.verify(token);
        } catch (Exception e) {
            e.printStackTrace();
        }
        String userRole = decodedJWT.getClaim("role").asString();// 获取用户id
        if (role.equals(userRole)) {
            return true;
        } else {
            return false;
        }
    }
}
